#pragma once
#include <spdlog/spdlog.h>
#include <spdlog/sinks/daily_file_sink.h>
#include <spdlog/sinks/rotating_file_sink.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <nlohmann/json.hpp>
#include <string>
#include <memory>
#include <unordered_map>
#include <vector>
#include "TrSingleton.h"

using json = nlohmann::json;

// 本文件禁止任何修改

namespace Common {

class LogManager : public TrSingleton<LogManager> {
    friend class TrSingleton<LogManager>;
public:
    // 初始化日志系统
    bool init(const std::string& configFile);
    
    // 获取指定模块的logger
    std::shared_ptr<spdlog::logger> getLogger(const std::string& name = "main");
    
    // 关闭所有日志
    void shutdown();
    
    // 刷新所有日志
    void flush();

private:
    // 创建日志sink
    spdlog::sink_ptr createSink(const json& config);
    
    // 创建logger
    bool createLogger(const std::string& name, const json& config);
    
    // 解析日志级别
    spdlog::level::level_enum parseLevel(const std::string& level);
    
    // 创建控制台logger
    bool createConsoleLogger(const json& config);
    
    std::unordered_map<std::string, std::shared_ptr<spdlog::logger>> m_loggers;
    bool m_initialized{false};
};

// 定义宏简化使用
#define LOG_MANAGER Common::LogManager::instance()
#define GET_LOGGER(name) Common::LogManager::instance()->getLogger(name)

// 模块日志宏 - 需要指定模块名称
#define MLOG_TRACE(module, ...) GET_LOGGER(module)->trace(__VA_ARGS__)
#define MLOG_DEBUG(module, ...) GET_LOGGER(module)->debug(__VA_ARGS__)
#define MLOG_INFO(module, ...) GET_LOGGER(module)->info(__VA_ARGS__)
#define MLOG_WARN(module, ...) GET_LOGGER(module)->warn(__VA_ARGS__)
#define MLOG_ERROR(module, ...) GET_LOGGER(module)->error(__VA_ARGS__)

// 默认日志宏 - 使用main模块
#define LOG_TRACE(...) MLOG_TRACE("main", __VA_ARGS__)
#define LOG_DEBUG(...) MLOG_DEBUG("main", __VA_ARGS__)
#define LOG_INFO(...) MLOG_INFO("main", __VA_ARGS__)
#define LOG_WARN(...) MLOG_WARN("main", __VA_ARGS__)
#define LOG_ERROR(...) MLOG_ERROR("main", __VA_ARGS__)

} // namespace Common